home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 045a / btp15.zip / CRUNCH2.PAS < prev    next >
Pascal/Delphi Source File  |  1991-11-08  |  4KB  |  138 lines

  1. PROGRAM Crunch2;              { (c) 1991 John C. Leon   last updated 11/4/91 }
  2.  
  3. {Handles ONLY standard, fixed length Btrieve files.}
  4.  
  5. {$IFDEF production} {$D-,R-,L-,S-} {$ENDIF}
  6.  
  7. USES
  8.    BTP;
  9.  
  10. CONST
  11.    NumInsertions =     5; {MaxInsBufLen = (2+(2*Number of Insertions) +   }
  12.    MaxInsBufLen  = 20462; { (MaxFixedRecLength*Number of Insertions)      }
  13.  
  14. TYPE
  15.    TExtDBuffer = record
  16.                     Count: word;
  17.                     Repeater: array[1..MaxInsBufLen-2] of byte;
  18.                     end;
  19.    PCopyFile   = ^TCopyFile;
  20.    TCopyFile   = object(BFixed)
  21.                     ExtDBuffer: TExtDBuffer;
  22.                     function BTExt(OpCode, Key: integer): integer;
  23.                     end;
  24.  
  25. VAR
  26.    OrgName, CopyName   : string[79];
  27.    OrgFile             : PBFixed;
  28.    CopyFile            : PCopyFile;
  29.    Counter,  Counter1,
  30.    DBuffOfs,
  31.    RecordLength        : integer;
  32.    LoRecordLength,
  33.    HiRecordLength      : byte;
  34.  
  35.  
  36. function TCopyFile.BTExt(OpCode, Key: integer): integer;
  37. var
  38.    ExtBufLen: integer;
  39. begin
  40.    ExtBufLen := 2 + (2 * ExtDBuffer.Count) + (Specs.RecLen * ExtDBuffer.Count);
  41.    BTExt := Btrv(OpCode, PosBlk, ExtDBuffer, ExtBufLen, KBuffer, Key);
  42. end;
  43.  
  44.  
  45. (* Begin MAIN program code *)
  46. (* ------------------------------------------------------------------------ *)
  47. BEGIN
  48.  
  49. write('Name of file to copy from: ');
  50. readln(OrgName);
  51. for Counter := 1 to length(OrgName) do
  52.    OrgName[Counter] := upcase(OrgName[Counter]);
  53.  
  54. write('Name of file to create and populate from file ''', OrgName,''': ');
  55. readln(CopyName);
  56. for Counter := 1 to length(CopyName) do
  57.    CopyName[Counter] := upcase(CopyName[Counter]);
  58.  
  59. { Open original file in read only mode }
  60. OrgFile  := new(PBFixed, Init(OrgName, ReadOnly));
  61. RecordLength   := OrgFile^.Specs.RecLen;
  62. LoRecordLength := lo(RecordLength);
  63. HiRecordLength := hi(RecordLength);
  64.  
  65. if BStatus <> Zero then
  66.  
  67.    writeln('Error opening ', OrgName)
  68.  
  69.    else
  70.  
  71.    begin                     {if original file exists and no error on open op}
  72.  
  73.    if OrgFile^.NumRecs = 0 then            {don't proceed if empty file}
  74.       begin
  75.       writeln('No records in ', OrgName, '.  CRUNCH aborted.');
  76.       halt;
  77.       end;
  78.  
  79.    if (OrgFile^.Specs.FileFlags and 1) = 1 then    {don't do var length files}
  80.       begin
  81.       writeln(OrgName, ' is a variable length file.  Can''t process.');
  82.       halt;
  83.       end;
  84.  
  85.    BStatus := CloneFile(OrgName, CopyName);
  86.    if BStatus = Zero then
  87.       writeln(CopyName, ' created successfully.')
  88.       else
  89.       begin
  90.       writeln('Error creating ', CopyName, '.  Status = ', BStatus, '.');
  91.       halt;
  92.       end;
  93.  
  94.    {Open new copy of file in accelerated mode.}
  95.    CopyFile := new(PCopyFile, Init(CopyName, Accel));
  96.  
  97.    Counter1  := Zero;
  98.    DBuffOfs  := 1;
  99.  
  100.    for Counter := 1 to OrgFile^.NumRecs do
  101.       begin
  102.       BStatus := OrgFile^.BT(BStepNext, Zero);
  103.       CopyFile^.ExtDBuffer.Repeater[DBuffOfs] := LoRecordLength;
  104.       inc(DBuffOfs);
  105.       CopyFile^.ExtDBuffer.Repeater[DBuffOfs] := HiRecordLength;
  106.       inc(DBuffOfs);
  107.       move(OrgFile^.DBuffer[1],
  108.            CopyFile^.ExtDBuffer.Repeater[DBuffOfs], RecordLength);
  109.       DBuffOfs := DBuffOfs + RecordLength;
  110.       if ((Counter MOD NumInsertions) = Zero) then
  111.          begin
  112.          CopyFile^.ExtDBuffer.Count := NumInsertions;
  113.          BStatus := CopyFile^.BTExt(BInsertExt, Zero);
  114.          DBuffOfs := 1;
  115.          Counter1 := Counter1 + NumInsertions;
  116.          writeln('Inserted total of ', Counter1, ' records');
  117.          end;
  118.       end; {for Counter := 1 to OrgFile^.NumRecs do}
  119.  
  120.    if ((OrgFile^.NumRecs MOD NumInsertions) <> Zero) then
  121.       begin
  122.       CopyFile^.ExtDBuffer.Count := (OrgFile^.NumRecs MOD NumInsertions);
  123.       Counter1 := Counter1 + CopyFile^.ExtDBuffer.Count;
  124.       BStatus  := CopyFile^.BTExt(BInsertExt, Zero);
  125.       writeln('Inserted total of ', Counter1, ' records');
  126.       writeln('DONE...');
  127.       end;
  128.  
  129.    BStatus := OrgFile^.Close;
  130.    BStatus := CopyFile^.Close;
  131.  
  132.    dispose(OrgFile, Done);
  133.    dispose(CopyFile, Done);
  134.  
  135.    end; {if BStatus <> Zero}
  136.  
  137. END.
  138.